﻿Imports System.Data.SqlClient
Imports System.IO
Imports Sendkey = System.Windows.Forms.SendKeys
'Imports System.Threading

Public Class FrmEstados_Procesales

#Region "Variables"

    Private cGeneral As New clsGeneral
    Private cAreas As New clsAreas
    Private cEstadosProcesales As New clsEstadosProcesales
    Private cTipos_Expediente As New clsTipos_Expediente

    Dim dtAreas As New DataTable()
    Dim dtEstadosProcesales As New DataTable()
    Dim dtTiposExpedientes As New DataTable()
    Dim dt As New DataTable
    Dim NuevaFila As DataRow

    Dim li_Respuesta As Int16
    Dim ls_Areas As String
    Dim ls_Tipos_Expediente As String

#End Region

#Region "Eventos"

    Private Sub FrmEstados_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        gs_Pantalla = Me.Name
        dtAreas.Clear()
        dtAreas = cAreas.ObtenerAreas("Alfabetico")
        NuevaFila = dtAreas.NewRow
        NuevaFila.Item("Area") = 9  ' valor NO almacenado en la tabla
        NuevaFila.Item("Nombre") = ".Todas las Areas"
        dtAreas.Rows.Add(NuevaFila)
        ' reordena el DataTable
        'dtAreas = dtAreas.Select(Nothing, "Nombre asc").CopyToDataTable()
        dtAreas = cGeneral.DataTable_Filtrar_Ordenar(dtAreas, "", "Nombre")
        Lst_Areas.DataSource = dtAreas
        Lst_Areas.ValueMember = dtAreas.Columns(0).ToString
        Lst_Areas.DisplayMember = dtAreas.Columns(1).ToString

        dtTiposExpedientes.Clear()
        dtTiposExpedientes = cTipos_Expediente.ObtenerTipos_Expediente("Alfabetico")
        Lst_TiposExpediente.DataSource = dtTiposExpedientes
        Lst_TiposExpediente.ValueMember = dtTiposExpedientes.Columns(0).ToString
        Lst_TiposExpediente.DisplayMember = dtTiposExpedientes.Columns(1).ToString

        dtEstadosProcesales.Clear()
        dtEstadosProcesales = cEstadosProcesales.ObtenerEstadosProcesales("Numerico")
        If dtEstadosProcesales.Rows.Count > 0 Then
            Despliega()
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Nuevo_Click(sender As Object, e As EventArgs) Handles Nuevo.Click
        Limpiar()
        Txt_Descripcion.Focus()
    End Sub

    Private Sub Guardar_Click(sender As Object, e As EventArgs) Handles Guardar.Click
        If Txt_Descripcion.Text.Trim = "" Then
            MessageBox.Show("Error - Descripcion no puede quedar vacía")
            Txt_Descripcion.Focus()
        ElseIf Lst_Areas.CheckedItems.Count = 0 Then
            MessageBox.Show("Error - Debe indicar al menos una Área a que corresponde")
            Lst_Areas.Focus()
        ElseIf Lst_TiposExpediente.CheckedItems.Count = 0 Then
            MessageBox.Show("Error - Debe indicar al menos un Tipo de Expediente a que corresponde")
            Lst_TiposExpediente.Focus()
        Else
            ' carga valores del objeto
            If Txt_Codigo.Text.Trim = "" Then
                cEstadosProcesales.Codigo = -1  ' para facilitar posicionamiento en DataTable luego de Incluir en cEstadosProcesales.Guardar()
            Else
                cEstadosProcesales.Codigo = CType(Txt_Codigo.Text, Integer)
            End If
            cEstadosProcesales.Nombre = Txt_Descripcion.Text.Trim
            cEstadosProcesales.Area_Corresponde = cGeneral.CheckedListBox_a_Hilera(Lst_Areas)
            cEstadosProcesales.Tipo_Expediente = cGeneral.CheckedListBox_a_Hilera(Lst_TiposExpediente)
            ' carga valores para Auditoría
            cEstadosProcesales.Aplicacion = gs_Sistema_Nombre
            cEstadosProcesales.Pantalla = gs_Pantalla
            cEstadosProcesales.Usuario = gs_Usuario
            cEstadosProcesales.Maquina = gs_Maquina
            cEstadosProcesales.Guardar()    ' cEstadosProcesales.EstadoGuardar contiene el Id insertado o modificado
            If cEstadosProcesales.EstadoGuardar = -1 Then   ' -1 = Error
                ' cEstadosProcesales.Guardar() despliega el mensaje de error
            Else
                ' Determina si los valores a almacenar ya existen o no
                If cEstadosProcesales.Codigo = -1 Then      ' -1 = Incluir
                    cEstadosProcesales.Codigo = cEstadosProcesales.EstadoGuardar
                    dtEstadosProcesales.Clear()
                    dtEstadosProcesales = cEstadosProcesales.ObtenerEstadosProcesales("Numerico")
                    ' el último es el que se acaba de ingresar así que lo posiciono en el DataTable
                    BindingContext(dtEstadosProcesales).Position = BindingContext(dtEstadosProcesales).Count - 1
                    Despliega()
                Else
                    ' modifica los datos actuales del DataTable
                    NuevaFila = dtEstadosProcesales.Select("EstadoProcesal=" & cEstadosProcesales.Codigo)(0)
                    NuevaFila.Item("EstadoProcesal") = cEstadosProcesales.Codigo
                    NuevaFila.Item("Nombre") = cEstadosProcesales.Nombre
                    ' NO hace falta refrescar el formulario con Despliega()
                End If
            End If
        End If
    End Sub

    Private Sub Buscar_Click(sender As Object, e As EventArgs) Handles Buscar.Click
        FrmConsulta.Tag = "EstadosProcesales"
        FrmConsulta.dt = dtEstadosProcesales
        FrmConsulta.ShowDialog()
        Application.DoEvents()
        If gi_Codigo_1 <> -1 Then ' posiciona el registro seleccionado
            For Fila As Integer = 0 To dtEstadosProcesales.Rows.Count - 1
                If dtEstadosProcesales.Rows(Fila).Item(0) = gi_Codigo_1 Then
                    BindingContext(dtEstadosProcesales).Position = Fila
                    Exit For
                End If
            Next
            Despliega()
        End If
    End Sub

    Private Sub Imprimir_Click(sender As Object, e As EventArgs) Handles Imprimir.Click
        'Dim dt_RPT As New DataTable("Resultados")
        'Dim NuevaFila As DataRow
        'Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

        If dtEstadosProcesales.Rows.Count > 0 Then
            Try
                '    dt_RPT.Columns.Add("Codigo")
                '    dt_RPT.Columns.Add("Descripcion")
                '    dt_RPT.Columns.Add("Titulo_Reporte")
                '    For Fila As Integer = 0 To ds.Tables("Resultados").Rows.Count - 1
                '        NuevaFila = dt_RPT.NewRow()
                '        NuevaFila("Codigo") = ds.Tables("Resultados").Rows(Fila).Item("ID_Contexto")
                '        NuevaFila("Descripcion") = ds.Tables("Resultados").Rows(Fila).Item("Nom_Contexto")
                '        NuevaFila("Titulo_Reporte") = "Reporte de Contextos"
                '        dt_RPT.Rows.Add(NuevaFila)
                '    Next

                '    CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()

                '    CrReport.Load(gs_RutaReportes & "RptCatalogos.rpt")

                '    CrReport.SetDataSource(dt_RPT)
                '    Frm_RPT_Visor.CrystalReportViewer1.ReportSource = CrReport
                '    Frm_RPT_Visor.Show()

            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        Else
            MessageBox.Show("No hay datos para imprimir")
        End If
    End Sub

    Private Sub Excel_Click(sender As Object, e As EventArgs) Handles Excel.Click
        If dtEstadosProcesales.Rows.Count > 0 Then
            cGeneral.DataTable_a_Excel(dtEstadosProcesales, BarraProgreso)
        Else
            MessageBox.Show("No hay datos para exportar")
        End If
    End Sub

    ' Cada formulario tiene un objeto BindingContext que mantiene el rastro de todos los recursos 
    ' de datos asociados con la forma. 
    ' Para referirse a una tabla utilice:
    '       BindingContext(nombre_DataTable)
    '
    ' Para referirse a una tabla dentro del Dataset utilice:
    '       BindingContext(nombre_Dataset, "NombreTabla")
    '
    ' El objeto BindingContext tiene una propiedad Position que indica el registro actual 
    ' y una propiedad Count que indica el Total de registros en el Dataset. El primer registro tiene 
    ' la posición 0, por lo que el último registro tiene la posición Count - 1. 

    Private Sub Primero_Click(sender As Object, e As EventArgs) Handles Primero.Click
        If BindingContext(dtEstadosProcesales).Count > 0 Then
            BindingContext(dtEstadosProcesales).Position = 0
            Despliega()
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Anterior_Click(sender As Object, e As EventArgs) Handles Anterior.Click
        If BindingContext(dtEstadosProcesales).Count > 0 Then
            If BindingContext(dtEstadosProcesales).Position > 0 Then
                BindingContext(dtEstadosProcesales).Position -= 1
                Despliega()
            End If
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Siguiente_Click(sender As Object, e As EventArgs) Handles Siguiente.Click
        If BindingContext(dtEstadosProcesales).Count > 0 Then
            If BindingContext(dtEstadosProcesales).Position < BindingContext(dtEstadosProcesales).Count - 1 Then
                BindingContext(dtEstadosProcesales).Position += 1
                Despliega()
            End If
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Ultimo_Click(sender As Object, e As EventArgs) Handles Ultimo.Click
        If BindingContext(dtEstadosProcesales).Count > 0 Then
            BindingContext(dtEstadosProcesales).Position = BindingContext(dtEstadosProcesales).Count - 1
            Despliega()
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Borrar_Click(sender As Object, e As EventArgs) Handles Borrar.Click
        If Txt_Codigo.Text.Trim = "" Then
            MessageBox.Show("Debe haber definido un código para poder borrarlo.")
            Txt_Codigo.Focus()
        Else
            li_Respuesta = MessageBox.Show("¿Desea BORRAR el registro de EstadoProcesal = " & Txt_Codigo.Text & "?", "", MessageBoxButtons.YesNo)
            If li_Respuesta = vbYes Then
                ' carga valores del objeto
                cEstadosProcesales.Codigo = CType(Txt_Codigo.Text, Integer)
                ' carga valores para Auditoría
                cEstadosProcesales.Aplicacion = gs_Sistema_Nombre
                cEstadosProcesales.Pantalla = gs_Pantalla
                cEstadosProcesales.Usuario = gs_Usuario
                cEstadosProcesales.Maquina = gs_Maquina
                cEstadosProcesales.Borrar()    ' cEstadosProcesales.EstadoGuardar contiene el Id insertado o modificado
                If cEstadosProcesales.EstadoGuardar = -1 Then   ' -1 = Error
                    ' cEstadosProcesales.Borrar() despliega el mensaje de error
                Else
                    dtEstadosProcesales.Rows.RemoveAt(BindingContext(dtEstadosProcesales).Position)
                    If dtEstadosProcesales.Rows.Count > 0 Then
                        ' se posiciona en el último registro
                        BindingContext(dtEstadosProcesales).Position = BindingContext(dtEstadosProcesales).Count - 1
                        Despliega()
                    Else
                        Limpiar()
                    End If
                End If
            End If
        End If
    End Sub

    Private Sub Txt_Codigo_KeyPress(sender As Object, e As KeyPressEventArgs)
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("0123456789", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use dígitos")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Codigo_Leave(sender As Object, e As EventArgs)
        If Trim(Txt_Codigo.Text) <> "" Then
            Dim li_Posicion As Integer = -1

            cEstadosProcesales.Codigo = CType(Txt_Codigo.Text, Integer)
            For i As Integer = 0 To dtEstadosProcesales.Rows.Count - 1
                If dtEstadosProcesales.Rows(i).Item("EstadoProcesal") = cEstadosProcesales.Codigo Then
                    li_Posicion = i
                    Exit For
                End If
            Next
            If li_Posicion = -1 Then
                MessageBox.Show("EstadoProcesal no registrada")
                Limpiar()
            Else
                BindingContext(dtEstadosProcesales).Position = li_Posicion
                Despliega()
            End If
        End If
    End Sub

    Private Sub Txt_Descripcion_KeyPress(sender As Object, e As KeyPressEventArgs)
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use letras")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Descripcion_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs)
        If Txt_Descripcion.Text.Trim = "" Then
            MessageBox.Show("Error - Descripcion no puede quedar vacía")
            e.Cancel = True
        End If
    End Sub

    Private Sub BarraProgreso_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs)
        Lbl_Progreso.Visible = BarraProgreso.Visible
        Application.DoEvents()
    End Sub

    Private Sub Lst_Areas_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles Lst_Areas.ItemCheck
        Dim i As Integer

        If e.Index = 0 Then
            ' si el elemento actual SI es el primero de la lista (Todas las Areas) desmarca los demás ítems
            For i = 1 To Lst_Areas.Items.Count - 1
                Lst_Areas.SetItemChecked(i, False)
            Next
        Else
            ' si el elemento actual NO es el primero de la lista desmarca el primer ítem (Todas las Areas)
            Lst_Areas.SetItemChecked(0, False)
        End If
    End Sub

#End Region

#Region "Metodos"

    Sub Despliega()
        NuevaFila = dtEstadosProcesales.Rows(BindingContext(dtEstadosProcesales).Position)
        Txt_Codigo.Text = NuevaFila.Item("EstadoProcesal")
        Txt_Descripcion.Text = NuevaFila.Item("Nombre")
        ls_Areas = NuevaFila.Item("Area_Corresponde")
        cGeneral.CheckedListBox_Limpiar(Lst_Areas)
        cGeneral.CheckedListbox_Marcar(Lst_Areas, ls_Areas)

        ls_Tipos_Expediente = NuevaFila.Item("Tipo_Expediente")
        cGeneral.CheckedListBox_Limpiar(Lst_TiposExpediente)
        cGeneral.CheckedListbox_Marcar(Lst_TiposExpediente, ls_Tipos_Expediente)
    End Sub

    Sub Limpiar()
        Txt_Codigo.Text = ""
        Txt_Descripcion.Text = ""
        cGeneral.CheckedListBox_Limpiar(Lst_Areas)
        cGeneral.CheckedListBox_Limpiar(Lst_TiposExpediente)
    End Sub

#End Region

End Class